package com.yuhuan.sowordtooffer;
import java.util.Arrays;

/**
 * 反转链表
 * 定义一个函数，输入一个链表的头节点，反转该链表并输出反转后链表的头节点。
 *
 *  
 *
 * 示例:
 *
 * 输入: 1->2->3->4->5->NULL
 * 输出: 5->4->3->2->1->NULL
 *
 * 作者：Krahets
 * 链接：https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/9pdjbm/
 * 来源：力扣（LeetCode）
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 */
public class Solution {
    public static void main(String[] args) {
        ListNode node1 = new ListNode(1);
        node1.next = new ListNode(2);
        node1.next.next = new ListNode(3);
        node1.next.next.next = new ListNode(5);
        System.out.println("创建新的node输出数组："+Arrays.toString(new PrintLinklist().reversePrint(node1)));
        System.out.println("反转后的node输出数组："+Arrays.toString(new PrintLinklist().reversePrint(new Solution().reverseList(node1))));

    }


    /**
     * 反转链表：说白了就是改变指针的方向
     * 反转链表的四条操作：
     * 1. 保存当前节点的next，即下一个节点的地址
     * 2. 改变当前节点的next地址，让它指向当前节点的上一个节点。如果是当前节点是第一个，则为空
     * 3. 当前节点前面的节点后移一格
     * 4. 当前节点后移一格
     * @param head node头
     * @return pre 反转后的node头
     */
    private ListNode reverseList(ListNode head) {
        ListNode tmp,pre=null;
        while (head!=null){
            tmp = head.next;
            head.next = pre;
            pre = head;
            head = tmp;
        }
        return  pre;
    }
}
